﻿using System;

namespace Csharp方法练习
{

    class Program
    {
        #region 加减工资
        //static void Addsalar(ref int salary)
        //{
        //    salary += 500;
        //}
        //static void Penatlysalar(ref int salary)
        //{
        //    salary -= 500;
        //}
        #endregion

        #region 交换两个int类型变量
        //static void change(ref int a,ref int b) 
        //{
        //    int temp = a;
        //    a = b;
        //    b = temp;
        //
        //}
        #endregion

        #region 第四题 Fighter

        //结构体
        //struct Fighter 
        //{
        //    public int hp;
        //    public int atk;
        //    //刚刚犯了一个错误！
        //    //方法要写在结构体里，才能调用
        //    public void Addtack(ref Fighter monster)//要用ref传值
        //    {
        //        monster.hp -= this.atk;
        //    }
        //}
        //怪物攻击函数




        #endregion

        #region 举例
        //static void getIntsum(int a,params int[] arr) //先定义一个a
        //{
        //    int sum = 0;
        //    for (int i = 0; i < arr.Length; i++)
        //    {
        //        sum += arr[i];
        //    }
        //    Console.WriteLine(sum);

        //}
        #endregion


        #region 函数重载

        #region 函数重载（参数影响）
        //函数重载对参数的影响：

        //当参数列表不一致时（参数列表包含了顺序，类型，参数个数）

        //参数个数不一样

        //同名函数构成重载

        //在编译时，系统会自动判别你的参数列表

        //根据参数列表去对应方法

        //返回类型对重载无影响

        //唯一判别是否重载的标准是参数列表
        #endregion

        //static void Add(int a, int b)
        //{
        //    Console.WriteLine(a + b);
        //}

        //static void Add(float a, float b)
        //{
        //    Console.WriteLine(a + b);
        //}
        #endregion


        static void Main(string[] args)
        {
            #region 第二题 

            //工资salary5000，通过加薪add和罚款penatly两个方法，实现工资的计算
            //两个方法
            //有效方法
            //用ref关键字

            //int salary = 5000;
            //Addsalar(ref salary);
            //Console.WriteLine(salary);

            //Penatlysalar(ref salary);
            //Console.WriteLine(salary);

            #endregion


            #region 第三题 

            ////使用方法交换两个int类型的变量
            ////找个第三方变量交换就行
            //int a = 10;
            //int b = 20;
            //change(ref a, ref b);
            //Console.WriteLine("{0},{1}",a,b);

            #endregion


            #region 第四题 

            //写一个结构Fighter，给其添加成员的health，写一个Attack的方法，使其可以攻击
            //另一个Fighter,并使其掉血

            //Fighter xiaoming = new Fighter();
            //xiaoming.atk = 100;
            //xiaoming.hp = 800;

            //Fighter xiaohua = new Fighter();
            //xiaohua.atk = 200;
            //xiaohua.hp = 600;

            ////初始化对局
            //Console.SetCursorPosition(0, 2);
            //Console.WriteLine("小明：血量{0}\t攻击力{1}\t", xiaoming.hp, xiaoming.atk);

            //Console.SetCursorPosition(0, 10);
            //Console.WriteLine("小花：血量{0}\t攻击力{1}\t", xiaohua.hp, xiaohua.atk);



            ////让两个对打
            //while (true)
            //{
            //    Console.ReadKey();
            //    //小明攻击小花
            //    xiaoming.Addtack(ref xiaohua);//要用ref传值
            //    if (xiaohua.hp<=0)
            //    {
            //        Console.SetCursorPosition(0, 5);
            //        Console.WriteLine("小花被小明打死了");
            //        break;
            //    }
            //    Console.SetCursorPosition(0, 2);
            //    Console.WriteLine("小明：血量{0}\t攻击力{1}\t", xiaoming.hp, xiaoming.atk);

            //    Console.SetCursorPosition(0, 10);
            //    Console.WriteLine("小花：血量{0}\t攻击力{1}\t", xiaohua.hp, xiaohua.atk);


            //    Console.ReadKey();//隔断
            //    xiaohua.Addtack(ref xiaoming);//第二局是小花打小明



            //    if (xiaoming.hp <=0)
            //    {
            //        Console.SetCursorPosition(0, 6);
            //        Console.WriteLine("小明被小花打死了");
            //        break;
            //    }

            //    Console.SetCursorPosition(0, 2);
            //    Console.WriteLine("小明：血量{0}\t攻击力{1}\t", xiaoming.hp, xiaoming.atk);

            //    Console.SetCursorPosition(0, 10);
            //    Console.WriteLine("小花：血量{0}\t攻击力{1}\t", xiaohua.hp, xiaohua.atk);

            #endregion

            #region 关键字params
            // 关键字：params 可变参数传参

            // 1）可变参数传参,在函数定义的时候可以，在参数前加上
            // 2）被params参数必须是数组类型
            // 参数个数可变
            // 将实例列表中跟可变参数数组类型一致的元素都当作数组的元素去处理
            // 3）只能作为参数列表中，最后一个参数 意思是（int a，float b，params c）

            //int[] arr1 = {12,34,4,567,78,45 };
            //getIntsum(arr1);
            //getIntsum(12,23,3,45,56);//没有报错。。直接传参到方法里面去了，那么12就赋值给a了
            #endregion

            #region 使用parmas参数，求一个数组的偶数和，和奇数和

            //static void GetArryEventAndOddSum(params int[]arr) 
            //{
            //    int eventSum = 0;
            //    int oddSum = 0;
            //    for (int i = 0; i < arr.Length; i++)
            //    {
            //        if (arr[i] % 2 == 0)
            //        {
            //            eventSum += arr[i];
            //        }
            //        else
            //        {
            //            oddSum += arr[i];
            //        }
            //    }
            //    Console.WriteLine("偶数和为：{0},奇数和为：{1}",eventSum,oddSum);
            //}

            //GetArryEventAndOddSum(1,32,44,65,44,79,73);

            #endregion

            #region 函数重载
            //写一个加法，让两个int类型的变量相加，打印出对应的结果

            //int a = 20;
            //int b = 30;
            //Add(10.22f, 12.34f);//系统根据参数列表去判别
            //Add(10,20);
            #endregion

            //test();//会把栈空舰堆满
            //Console.WriteLine(jiecheng(5));
            //Console.WriteLine(jiechengSum(3));
            //Console.WriteLine(zhugan(2));

            #region 综合练习一
            //int num1 = 0;
            //int num2 = 0;
            //while (true)
            //{
            //    Console.WriteLine("请输入第一个数字");
            //    num1 = int.Parse(Console.ReadLine());


            //    Console.WriteLine("请输入第二个数字");
            //    num2 = int.Parse(Console.ReadLine());
            //    if (CheckInput(num1, num2))
            //    {
            //        break;
            //    }
            //    else 
            //    { 
            //        Console.WriteLine("输入有误，第一个数必须比第二个数小"); 
            //    }
            //}

            //int sum = GetSum(num1,num2);
            //Console.WriteLine("{0}和{1}之间的和为：{2} ",num1,num2,sum);

            #endregion

            #region 综合练习二

            #endregion


        }
        #region 函数递归
        /*
         * 1)找出递归问题的可满足条件
         * 2)把这个条件交给自己
         * 3)这个条件无尽向可满足边界靠近
         * 
         * 如果没有边界 ，会无限调用自己，把栈爆了
         * 用return跳出循环
         * 跳出需要条件---达到目的
         * 每次调用要有变化，朝边界靠近
         * 一旦达到边界跳出
         * 
         * 
         * 自己调用自己
         */

        //static void test() //调用静态方法通过program调用，方法就在之中，所以可以直接调用
        //{
        //    Console.WriteLine("111");
        //    test();
        //}
        #endregion

        #region 函数递归第一题 求5！
        //static int jiecheng(int n)
        //{
        //    if (n == 1)
        //    {
        //        return 1;
        //    }
        ////变化
        // return n * jiecheng(n - 1);

        //}

        #endregion


        #region  函数递归第二题  求1！+2！+3！+4!+5!+6!+.....+10!
        //S(n)=f(n)+S(n-1)//找出规律
        //static int jiechengSum(int n) 
        //{
        //    if (n == 1)
        //    {
        //        return 1;
        //    }
        //    return jiechengSum(n - 1) + jiecheng(n);

        //}


        #endregion



        #region  函数递归第三题 一根竹竿长100m，每天砍掉一半，问第十天他的长度是多少
        //n/2
        //1:100 2:50 3:25 4：12.5 n天：前一天长度的一半
        //L(n)=L(n-1)/2
        //static double zhugan(int day)
        //{
        //    if (day == 1)
        //    {
        //        return 100;
        //    }
        //    return zhugan(day - 1) / 2;
        //}

        #endregion

        #region 综合练习一
        /*
         * 提示用户输入两个数字，计算两个数字之间的所有整数之和
         * 用户只能输入数字
         * 计算两个数字之间所有整数的和
         * 要求第一个数字必须比第二个数字小，否则就重新输入
         */

        //方法的作用是：检测第一个数字比第二个数字小
        //static bool CheckInput(int num1, int num2)
        //{
        //    if (num1 < num2)
        //    {
        //        return true;
        //    }
        //    else 
        //        return false;
        //}

        //static int GetSum(int num1,int num2)
        //{
        //    int sum = 0;
        //    for (int i = num1; i <= num2; i++)
        //    {
        //        sum += i;
        //    }
        //    return sum;
        //}

        #endregion

        #region 综合练习二
        #endregion


    }



}

    


